package com.example.Stream;

import java.util.ArrayList;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.stream.Stream;

public class Test3Stream {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("张三丰");
        list.add("张无忌");
        list.add("张翠山");
        list.add("王二麻子");
        list.add("张良");
        list.add("谢广坤");


        //在forEach方法的底层,会循环获取到流中的每一个数据
        //并循环调用accept方法,并把每一个数据传递给accept方法
        //s就依次表示了流中的每一个数据，
        //所以,我们只要在accept方法中,写上处理的业务逻辑就可以了
        list.stream().forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });

        System.out.println("===================");

        //lambda表达式的简化格式
        //是因为Consumer接口中,只有一个accept方法
        list.stream().forEach(
                (String s) -> {
                    System.out.println(s);
                });
        System.out.println("===================");

        //lambda表达式还是可以进一步简化的，
        list.stream().forEach(s -> System.out.println(s));

        long count = list.stream().count();
        System.out.println(count);  //6

        //method2(list);
        //method(list);
    }

    private static void method2(ArrayList<String> list) {
        list.stream().limit(2).forEach(s -> System.out.println(s));
//        张三丰
//        张无忌
        System.out.println("---------------------");
        list.stream().skip(2).forEach(s -> System.out.println(s));
//        张翠山
//        王二麻子
//        张良
//        谢广坤
        System.out.println("---------------------");
        ArrayList<String> list1 = new ArrayList<>();
        list.add("王二麻子");
        list.add("谢广坤");
        Stream.concat(list.stream(), list1.stream()).forEach(s -> System.out.println(s));
        System.out.println("---------------------");
        list.stream().distinct().forEach(s -> System.out.println(s));
    }

    private static void method(ArrayList<String> list) {
        //filter方法获取流中的 每一个数据
        //而test方法中的s,就依次表示流中的每一个数据
        //我们只要在test方法中对s进行判断就可以了
        //如果判断的结果为true,则当前的数据留下
        //如果判断的结果为false,则当前数据就不要
        list.stream().filter(new Predicate<String>() {
            @Override
            public boolean test(String s) {
                boolean result = s.startsWith("张");
                return result;
            }
        }).forEach(s -> System.out.println(s));

        System.out.println("-------------------------");

        //因为Predicate接口中只有一个抽象方法test
        //所以我们可以使用lambda表达式来简化
        list.stream().filter(s -> s.startsWith("张")).forEach(s -> System.out.println(s));
    }
}
